#include <iostream>
#include <cstring>
using namespace std;

class String{
    public: 
        String(const char *str = NULL);
        String(const String &other);
        void show();
        /*
            约定： 前置操作需要立刻修改当前对象，并返回对象的引用 ， 参数类型为void
        */
         // 前置 b = ++a, a+=1, b= a
        String &operator++();
       
        // 后置 b = a++, b = a , a+=1 
        String operator++(int);
    private: 
        char * str; 
};

String::String(const char *str) {
    if (str == NULL) {
        this-> str = NULL;
    } else {
        int len = strlen(str) + 1;
        this->str = new char[len];
        strcpy(this-> str, str);
    }
}
String::String(const String &other) {
    cout << "invoke 拷贝构造函数" << endl;
    this->str = new char[strlen(other.str) + 1];
    strcpy(this->str, other.str);
}


// 前置++ 获取字符
String &String::operator++(void) {
    // this指向当前String对象的指针
    if(!this->str) {
        return *this;
    }
    // p != NULL  && *p != '\0'
    for(char *p = this->str; p && *p ; p ++) {
        *p = *p + 1;
    }
    return *this;
}
// 后置++  相当于返回的还是原来的 先拷贝再加一
String String::operator++(int) {
    if (!this->str) {
        return *this;
    }
    String oldStr(*this);
    for (char *p = this->str; p && *p ; p++) {
        *p = *p + 1;
    }
    return oldStr;
}

void String::show() {
    cout << "str: " << str <<endl;  
}

int main(int argc, char const *argv[])
{
    String str1("hello");
   
    return 0;
}
